ゲーム状態の取得
今、あなたはゲームの発表が直接端末に表示されるのを見ており、ゲームのダイナミクスをよりよく理解できるようになっています。しかし、これらの洞察はゲーム内で発生する特定のアクションに限られています。
すべてのプレイヤーの位置、健康、エネルギーなど、包括的なゲームデータにオンデマンドでアクセスできるとしたら、より便利ではありませんか?この情報は、脅威、機会、タイミングをより効果的に評価するのに役立ち、戦略的計画を大幅に改善できるでしょう。
前回のガイドで作成したボットに別のハンドラーを追加することを考えたなら、あなたは絶対に正しいです!
コードを書く
bot.lua
ファイルに戻り、既存のハンドラーを次のように更新します:
Handlers.add(
"HandleAnnouncements",
{ Action = "Announcement" },
function (msg)
ao.send({Target = Game, Action = "GetGameState"})
print(msg.Event .. ": " .. msg.Data)
end
)
ハンドラーへの調整内容:
- より広範な役割を反映するために、
"HandleAnnouncements"
に名前を変更。 - ゲームの最新状態を要求するための追加操作を追加。このゲームは、
GetGameState
アクションタグに応じて応答するように設計されています。
発表を印刷したときに、次のようにしてInbox
内の最新のメッセージを確認できます:
Inbox[#Inbox]
このメッセージのData
フィールドには、ゲームの最新状態が含まれています。これには以下が含まれます:
GameMode
: ゲームがWaiting
またはPlaying
状態かどうか。TimeRemaining
: ゲームの開始または終了までの残り時間。Players
: 各プレイヤーの位置、健康、エネルギーなどの統計を含むテーブル。
しかし、これは単に読むだけでなく、最新の状態から情報を使用して他の自動化を行うためのさらなるステップを踏むことができます。
以下のように最新の状態を格納する新しい変数を定義しましょう:
LatestGameState = LatestGameState or nil
この構文は、端末においてbot.lua
ファイルの後続のイテレーションをロードする際に、変数の既存の値を保持し、上書きするのではなく、nil
の値を変数に割り当てます。
次に、以下のように別のハンドラーを実装します:
-- Handler to update the game state upon receiving game state information.
Handlers.add(
"UpdateGameState",
{ Action = "Announcement" },
function (msg)
local json = require("json")
LatestGameState = json.decode(msg.Data)
ao.send({Target = ao.id, Action = "UpdatedGameState"})
print("Game state updated. Print \'LatestGameState\' for detailed view.")
end
)
前のハンドラーからのゲームプロセスの応答には、値GameState
を持つアクションタグがあり、これによってこの二番目のハンドラーがトリガーされます。トリガーされると、ハンドル関数は組み込みのjson
パッケージをロードし、データをjsonに解析してLatestGameState
変数に保存します。
このハンドラーは、状態が更新されたときにプロセスにメッセージを送信します。この機能の重要性は、次のセクションで説明されます。
以下のドロップダウンでbot.lua
の最新コードを参照できます:
Updated bot.lua file
LatestGameState = LatestGameState or nil
Handlers.add(
"HandleAnnouncements",
{ Action = "Announcement" },
function (msg)
ao.send({Target = Game, Action = "GetGameState"})
print(msg.Event .. ": " .. msg.Data)
end
)
Handlers.add(
"UpdateGameState",
{ Action = "GameState" },
function (msg)
local json = require("json")
LatestGameState = json.decode(msg.Data)
ao.send({Target = ao.id, Action = "UpdatedGameState"})
print("Game state updated. Print \'LatestGameState\' for detailed view.")
end
)
ローディングとテスト
いつものように、この新機能をテストするために、次のようにしてファイルをあなたのaosプレイヤー端末にロードします:
.load bot.lua
その後、次のようにその名前を単に渡して、LatestStateVariable
が正しく更新されたかどうかを確認します:
LatestGameState
ゲームの最新状態へのリアルタイムアクセスにより、あなたのボットは情報に基づいた決定を下すことができ、次のアクションを決定します。次は、このデータを活用してアクションを自動化してみましょう🚶